C# Job Systemを使ったUnity流マルチスレッドプログラミングの話


概要

CEDEC2017 マルチスレッドで動かすための書き方 + コンパイラオプションのはなし。



DataOrientedProgramming

データ構造を分離してぶん投げる


MonoBehaviour -> structMonoBehaviourみたいなのを作った


JobComponentSysytemを実装



GCなし

NativeArrayの導入

うおーーーNativeArray入ってるのか

var src = new NativeArray<float>(500, Allocator.Temp);

src.Dispose();



安全

エラーで指摘してくれる

例えば依存した順番のジョブを順番指定なしで実行すると、依存書けよってえらーになる。



高速な新コンパイラ

Mono > IL > JobComp > DomainModel > Opt > LLVMからExeが出力される



IJobXインターフェース

単体のジョブ、毎フレームExecute関数を実行してくれる。


Scheduleで開始して、JobHandleを返してくるので、次のフレームとかでCompleteでまつ。というのが使い道。


例えばマッシブなアレイのコピーとかを別スレッドに入れることができる。

ネストもか~。



今後、いろんなものがスレッド内で使える様になるぽい。transformはすでに扱える。

IJobParallelForTransformとかがあるぽい。一般化どうなるんだろう。



Jobコンパイラ

ここまではJobシステムの話。

で、新コンパイラのサポートをうけるには、[ComputeJobOptomization(Accuracy, Supprt)]というのを書けばいい。


新Mathライブラリとか

mathf -> mathというのを作ったらしい。



今までのプログラムがどう変わるか

MonoBehaviourで書いてたキューブの回転を変えてみる


どれくらい高速化できるか。


その1

MonoBehaviour大量 -> Managerが単一のMBで一気に回す


その2

TransformAccessArrayというのを使って、ParallelJobで放り込む

これもいいんだけど、作り方を変えてみる


その3

MB -> IComponentBehaviour

ComponentSystemという方を継承して、ComponentArray<ScriptBehaviour>を持たせて、[InjectTuple](全部のInjectTupleAttrがついてる項目をUnionにする


ComponentSystemというのがComponentを放り込んでいい感じに動かしてくれるマネージャ。


その4

Jobにするために、 JobComponentSystemを継承させる。で、これでPararllelForで動かせる様になる。



使い所

距離計算、AI影響マップの生成に使えたりするよ、と。

あとは判定のあるエフェクトとかができそうな気がする。